package com.tedu.review.day02;

/**
 * 抽象类的特点：<补充>
 *    抽象类=类：成员变量+成员方法+成员类
 *     成员变量：既可以是变量也可以是常量
 *     构造方法：有
 *             用于子类访问父类的数据【父类默认初始化】
 *     成员方法：既可以是抽象的，也可以是非抽象的
 *
 *  抽象类中方法的特性：
 *    A：抽象方法----目的：强制子类做的事情【子类一定重写】
 *    B:非抽象方法---目的：子类继承的事情，提高代码的复用性【与普通父类一样】
 *
 */
abstract class Foo{
    //成员变量
    public int i=10;
    //成员变量修饰加上final  也可以加常量【识别常量：标识符全大写】
    public final int J=20;

    public Foo() {//创建对象空间同时一并创建：初始化---传输成员变量数据
        this(30);//this()调用本类其他构造器，调用有参数--当前属性/成员变量之间新赋值
    }

    public Foo(int i) {
        this.i = i;
    }
    //成员方法：抽象【重写】、非抽象【提高复用-继承父亲】
    public abstract void show();
    public void method(){
        System.out.println("Foo--method");
    }
}
//无法实现实例化：【无法直接创建对象】---继承---多态---利用造型
//Goo  子类【实现类】继承  抽象类  子类必须重写抽象类中所有抽象方法
class Goo extends Foo{

    public void show() {//抽象类  抽象方法show（）----一定重写
        System.out.println("show Goo");
    }
    public void method(){
        System.out.println("Goo  method");
    }
}
public class 抽象类特点1 {
    public static void main(String[] args) {
        //创建对象---实例化
        //Foo f=new Foo();
        Foo f=new Goo();
        //①实例化--初始化Goo（）构造器，默认存在空构造器
        //②空构造器默认存在：super（）调用父类的无参构造器
        //③父类无参构造器中存在：this（）调用本类有参构造器
        //④this（参数）给Foo抽象的i值进行覆盖  i=30
        System.out.println(f.i);
        //调取抽象类常量，可以常量赋值？X

        //------------------------------------------------------------
        f.show();//抽象方法    一定被子类重写 Goo show
        f.method();//非抽象方法    选择实现重写    Foo  show
    }
}
